﻿using System.IO;
using System.Windows.Forms;
using System.ComponentModel;

namespace Kyoh.Lib.WinForms
{
    /// <summary>デザイナなどにおける書き込み用に開くファイルのエディタを提供します。</summary>
    public partial class SaveFilePathEditor : PathEditor
    {
        /// <summary><see cref="SaveFilePathEditor"/> クラスの新しいインスタンスを初期化します。</summary>
        public SaveFilePathEditor()
        {
            InitializeComponent();
        }

        /// <summary>パスが妥当な値であるかどうか検証します。</summary>
        /// <param name="path">検証対象のパス文字列。</param>
        /// <returns>パスの妥当性を表す <see cref="PathEditor.PathValidation"/> 値。</returns>
        protected override PathValidation CheckPath(string path)
        {
            if (string.IsNullOrEmpty(path))
                return PathValidation.Empty;
            else if (!File.Exists(path))
                return PathValidation.Valid;
            else
                return PathValidation.Invalid;
        }

        /// <summary>パスの選択画面を表示して、ユーザからパスの入力を受け取ります。</summary>
        /// <returns>ユーザの入力したパス。</returns>
        protected override string SelectPath()
        {
            this.dialog.FileName = this.Path;
            if (this.dialog.ShowDialog() == DialogResult.OK)
                return this.dialog.FileName;
            else
                return base.SelectPath();
        }

        /// <summary>ユーザーが存在しないファイルを指定した場合に、ファイルを作成することを確認するメッセージをダイアログ ボックスで表示するかどうかを示す値を取得または設定します。</summary>
        [Category("Behavior")]
        [DefaultValue(false)]
        public bool CreatePrompt { get { return this.dialog.CreatePrompt; } set { this.dialog.CreatePrompt = value; } }
        /// <summary>ユーザーが既に存在するファイル名を指定した場合に [名前を付けて保存] ダイアログ ボックスで警告を表示するかどうかを示す値を取得または設定します。</summary>
        [Category("Behavior")]
        [DefaultValue(true)]
        public bool OverwritePrompt { get { return this.dialog.OverwritePrompt; } set { this.dialog.OverwritePrompt = value; } }

        /// <summary>ユーザーが拡張子を指定しない場合、ダイアログ ボックスがファイル名に自動的に拡張子を付けるかどうかを示す値を取得または設定します。</summary>
        [DefaultValue(true)]
        [Category("Behavior")]
        public bool AddExtension { get { return this.dialog.AddExtension; } set { this.dialog.AddExtension = value; } }
        /// <summary>この System.Windows.Forms.FileDialog インスタンスを Windows Vista で実行する場合に、外観と動作を自動的にアップグレードするかどうかを示す値を取得または設定します。</summary>
        [DefaultValue(true)]
        public bool AutoUpgradeEnabled { get { return this.dialog.AutoUpgradeEnabled; } set { this.dialog.AutoUpgradeEnabled = value; } }
        /// <summary>存在しないファイルの名前をユーザーが指定した場合に、ダイアログ ボックスが警告を表示するかどうかを示す値を取得または設定します。</summary>
        [Category("Behavior")]
        [DefaultValue(false)]
        public virtual bool CheckFileExists { get { return this.dialog.CheckFileExists; } set { this.dialog.CheckFileExists = value; } }
        /// <summary>存在しないパスをユーザーが指定したときに、ダイアログ ボックスに警告を表示するかどうかを示す値を取得または設定します。</summary>
        [DefaultValue(true)]
        [Category("Behavior")]
        public bool CheckPathExists { get { return this.dialog.CheckPathExists; } set { this.dialog.CheckPathExists = value; } }
        /// <summary>既定のファイル名の拡張子を取得または設定します。</summary>
        [Category("Behavior")]
        [DefaultValue("")]
        public string DefaultExt { get { return this.dialog.DefaultExt; } set { this.dialog.DefaultExt = value; } }
        /// <summary>ダイアログ ボックスが、ショートカットで参照されたファイルの場所を返すかどうか、またはショートカットの場所 (.lnk) を返すかどうかを指定する値を取得または設定します。</summary>
        [Category("Behavior")]
        [DefaultValue(true)]
        public bool DereferenceLinks { get { return this.dialog.DereferenceLinks; } set { this.dialog.DereferenceLinks = value; } }
        /// <summary>ダイアログ ボックスの [ファイルの種類] ボックスに表示される選択肢を決定する、現在のファイル名のフィルタ文字列を取得または設定します。</summary>
        /// <exception cref="System.ArgumentException">Filter の形式が無効です。</exception>
        [DefaultValue("")]
        [Localizable(true)]
        [Category("Behavior")]
        public string Filter { get { return this.dialog.Filter; } set { this.dialog.Filter = value; } }
        /// <summary>ファイル ダイアログ ボックスで現在選択されているフィルタのインデックスを取得または設定します。</summary>
        [DefaultValue(1)]
        [Category("Behavior")]
        public int FilterIndex { get { return this.dialog.FilterIndex; } set { this.dialog.FilterIndex = value; } }
        /// <summary>ファイル ダイアログ ボックスに表示される起動ディレクトリを取得または設定します。</summary>
        [DefaultValue("")]
        [Category("Data")]
        public string InitialDirectory { get { return this.dialog.InitialDirectory; } set { this.dialog.InitialDirectory = value; } }
        /// <summary>ダイアログ ボックスを閉じる前に、現在のディレクトリを復元するかどうかを示す値を取得または設定します。</summary>
        [Category("Behavior")]
        [DefaultValue(false)]
        public bool RestoreDirectory { get { return this.dialog.RestoreDirectory; } set { this.dialog.RestoreDirectory = value; } }
        /// <summary>ファイル ダイアログ ボックスに [ヘルプ] ボタンを表示するかどうかを示す値を取得または設定します。</summary>
        [DefaultValue(false)]
        [Category("Behavior")]
        public bool ShowHelp { get { return this.dialog.ShowHelp; } set { this.dialog.ShowHelp = value; } }
        /// <summary>複数のファイル名拡張子を持つファイルの表示および保存をダイアログ ボックスがサポートするかどうかを示す値を取得または設定します。</summary>
        [DefaultValue(false)]
        [Category("Behavior")]
        public bool SupportMultiDottedExtensions { get { return this.dialog.SupportMultiDottedExtensions; } set { this.dialog.SupportMultiDottedExtensions = value; } }
        /// <summary>ファイル ダイアログ ボックスのタイトルを取得または設定します。</summary>
        [Category("Appearance")]
        [DefaultValue("")]
        [Localizable(true)]
        public string Title { get { return this.dialog.Title; } set { this.dialog.Title = value; } }
        /// <summary>ダイアログ ボックスが有効な Win32 ファイル名だけを受け入れるかどうかを示す値を取得または設定します。</summary>
        [Category("Behavior")]
        [DefaultValue(true)]
        public bool ValidateNames { get { return this.dialog.ValidateNames; } set { this.dialog.ValidateNames = value; } }
    }
}
